--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Utilities/rnid.py fa4d4c6716d4894aba8ebddbdeec6f8061ade577 (fa4d4c67) Text, 54.42 KB
T8b949e#!/usr/bin/env python3
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787argparse
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787os
Tff7b72import T7ee787io
Tff7b72import T7ee787base64
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787RNST7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3mp
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787validate Tff7b72import Te6edf3Validator
Tff7b72from T7ee787RNST7ee787.T7ee787CryptographyT7ee787.T7ee787Hashes Tff7b72import Te6edf3sha256
Tff7b72from T7ee787RNST7ee787.T7ee787CryptographyT7ee787.T7ee787Hashes Tff7b72import Te6edf3file_sha256
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrnsTa5d6ff"
Te6edf3DEFAULT_ASPECTS Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3APP_NAMETffd700}Ta5d6ff.idTa5d6ff"
Te6edf3NO_MESSAGE Tff7b72= T79c0ff0x01
Te6edf3NO_META Tff7b72= T79c0ff0x02
Te6edf3PRV_EXT Tff7b72= Ta5d6ff"Ta5d6ffridTa5d6ff"
Te6edf3PUB_EXT Tff7b72= Ta5d6ff"Ta5d6ffpubTa5d6ff"
Te6edf3SIG_EXT Tff7b72= Ta5d6ff"Ta5d6ffrsgTa5d6ff"
Te6edf3MSG_EXT Tff7b72= Ta5d6ff"Ta5d6ffrsmTa5d6ff"
Te6edf3ENCRYPT_EXT Tff7b72= Ta5d6ff"Ta5d6ffrfeTa5d6ff"
Te6edf3CHUNK_BLOCKS Tff7b72= T79c0ff1024Tff7b72*T79c0ff1024
Te6edf3ENC_CHUNK Tff7b72= Te6edf3CHUNK_BLOCKSTff7b72*Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffAES256_BLOCKSIZE
Te6edf3DEC_CHUNK Tff7b72= Te6edf3ENC_CHUNK Tff7b72+ Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffTokenTff7b72.Td2a8ffTOKEN_OVERHEADTff7b72*T79c0ff2
Te6edf3RSG_HASHTYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4]
Te6edf3R_OK Tff7b72= T79c0ff0
Te6edf3R_NO_SIG_FILE Tff7b72= T79c0ff1
Te6edf3R_NO_IDENTITY Tff7b72= T79c0ff2
Te6edf3R_NO_PUBKEY Tff7b72= T79c0ff3
Te6edf3R_NO_PRVKEY Tff7b72= T79c0ff4
Te6edf3R_NO_KEYS Tff7b72= T79c0ff5
Te6edf3R_NO_FILE Tff7b72= T79c0ff6
Te6edf3R_INVALID_FILE Tff7b72= T79c0ff7
Te6edf3R_INVALID_IDENTITY Tff7b72= T79c0ff8
Te6edf3R_INVALID_ASPECTS Tff7b72= T79c0ff9
Te6edf3R_INVALID_SIGNATURE Tff7b72= T79c0ff10
Te6edf3R_FILE_EXISTS Tff7b72= T79c0ff11
Te6edf3R_DECRYPT_FAILED Tff7b72= T79c0ff12
Te6edf3R_INVALID_ARGS Tff7b72= T79c0ff250
Te6edf3R_SEQUENCE_ERROR Tff7b72= T79c0ff251
Te6edf3R_READ_ERROR Tff7b72= T79c0ff252
Te6edf3R_WRITE_ERROR Tff7b72= T79c0ff253
Te6edf3R_UNKNOWN_ERROR Tff7b72= T79c0ff254
Te6edf3R_INTERRUPTED Tff7b72= T79c0ff255
Te6edf3reticulum Tff7b72= Tff7b72None
Tff7b72def Td2a8ffvalidate_argsTb4b4b4(Te6edf3argsTb4b4b4)Tb4b4b4:
Te6edf3ops Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Te6edf3o Tff7b72in Tb4b4b4[Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4, Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4, Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4, Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4, Te6edf3argsTff7b72.Td2a8ffsign_messageTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3oTb4b4b4: Te6edf3ops Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3ops Tff7b72> T79c0ff1Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThis utility currently only supports one of the encrypt, decrypt, sign or verify operations per invocationTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3g Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Te6edf3a Tff7b72in Tb4b4b4[Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4, Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4, Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3aTb4b4b4: Te6edf3g Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3g Tff7b72> T79c0ff1Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe -i, -g, -m and -M args are mutually exclusiveTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3g Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Te6edf3a Tff7b72in Tb4b4b4[Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4, Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4, Te6edf3argsTff7b72.Td2a8ffbase256Tb4b4b4, Te6edf3argsTff7b72.Td2a8ffhexTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3aTb4b4b4: Te6edf3g Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3g Tff7b72> T79c0ff1Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe -b, -B, --hex and --base256 args are mutually exclusiveTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Identity & Encryption UtilityTa5d6ff"Tb4b4b4)
T8b949e# Identity Resolution
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--identityTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffridTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffhexadecimal Reticulum identity or destination hash, or path to Identity fileTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--generateTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffgenerate a new Identity and save to pathTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--import-pubTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffimport_pubTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffridTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffimport public Reticulum identity in hex, base32 or base64 format, or from fileTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-MTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--import-prvTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffimport_prvTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffridTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffimport Reticulum identity in hex, base32 or base64 format, or from fileTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-xTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--export-pubTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffexport public identity to hex, base32 or base64 formatTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-XTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--export-prvTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffexport private identity to hex, base32 or base64 format, or to fileTa5d6ff"Tb4b4b4)
T8b949e# Verbosity Control
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--verboseTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffincrease verbosityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-qTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--quietTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdecrease verbosityTa5d6ff"Tb4b4b4)
T8b949e# Operations
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--announceTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffaspectsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3constTff7b72=Te6edf3DEFAULT_ASPECTSTb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffannounce a destination based on this IdentityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-HTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--hashTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffaspectsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow destination hashes for other aspects for this IdentityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-dTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--decryptTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdecrypt fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-eTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--encryptTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffencrypt fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-VTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--validateTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffvalidate signatureTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--signTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffsign fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-STa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--sign-messageTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3constTff7b72=Te6edf3NO_MESSAGETb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffcreate embedded signed messageTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-ETa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--embed-metaTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3constTff7b72=Te6edf3NO_METATb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffembed metadata structure from fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--meta-specTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffvalidate metadata for embedding with spec from fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--rawTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffsign raw input data instead of hashing firstTa5d6ff"Tb4b4b4)
T8b949e# I/O Control
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--writeTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffoutput file pathTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--readTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffinput file path for operations with optional file inputTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--forceTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffwrite output even if it overwrites existing filesTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-ITa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--stdinTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Te6edf3argparseTff7b72.Td2a8ffSUPPRESSTb4b4b4) T8b949e# help="read input from STDIN instead of file"
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-OTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--stdoutTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Te6edf3argparseTff7b72.Td2a8ffSUPPRESSTb4b4b4) T8b949e# help="write output to STDOUT instead of file"
T8b949e# Information Flow
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-RTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--requestTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrequest unknown Identities from the networkTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-NTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--no-cacheTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffnever used cached or network-sourced informationTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffidentity request timeout before giving upTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-pTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--print-identityTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffprint identity info and exitTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-PTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--print-privateTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffallow displaying private keysTa5d6ff"Tb4b4b4)
T8b949e# Formatting Control
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-BTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--base32Ta5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffUse base32-encoded input and outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-bTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--base64Ta5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffUse base64-encoded input and outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-UTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--base256Ta5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffUse base256-encoded input and outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-FTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--hexTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffUse hex-encoded input and outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--metaTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffDisplay RSM metadata if availableTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnid Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Te6edf3validate_argsTb4b4b4(Te6edf3argsTb4b4b4)
Te6edf3op_requires_identity Tff7b72= Tb4b4b4(Te6edf3argsTff7b72.Td2a8ffsign Tff7b72or Te6edf3argsTff7b72.Td2a8ffsign_message Tff7b72or Te6edf3argsTff7b72.Td2a8ffencrypt Tff7b72or Te6edf3argsTff7b72.Td2a8ffdecrypt Tff7b72or Te6edf3argsTff7b72.Td2a8ffannounce Tff7b72or Te6edf3argsTff7b72.Td2a8ffwrite
Tff7b72or Te6edf3argsTff7b72.Td2a8ffprint_identity Tff7b72or Te6edf3argsTff7b72.Td2a8ffprint_identity Tff7b72or Te6edf3argsTff7b72.Td2a8ffexport_pub Tff7b72or Te6edf3argsTff7b72.Td2a8ffexport_prvTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3get_operating_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3allow_noneTff7b72=Tff7b72not Te6edf3op_requires_identityTb4b4b4, Te6edf3no_cacheTff7b72=Te6edf3argsTff7b72.Td2a8ffno_cacheTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72False
Tff7b72if Tff7b72not Te6edf3identity Tff7b72and Te6edf3op_requires_identityTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not get working identityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffprint_identityTb4b4b4: Te6edf3print_identity_informationTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffexport_pubTb4b4b4: Te6edf3export_pub_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffexport_prvTb4b4b4: Te6edf3export_prv_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffhashTb4b4b4: Te6edf3print_hash_informationTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identity Tff7b72or Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffannounceTb4b4b4: Te6edf3announceTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4: Te6edf3validateTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identity Tff7b72or Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4: Te6edf3signTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsign_messageTb4b4b4: Te6edf3sign_messageTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4: Te6edf3encryptTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4: Te6edf3decryptTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4: Te6edf3write_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4; Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4: Te6edf3op Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3opTb4b4b4: Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INTERRUPTEDTb4b4b4)
T8b949e#####################
T8b949e# Reticulum Helpers #
T8b949e#####################
Tff7b72def Td2a8ffensure_reticulumTb4b4b4(Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3reticulum
Tff7b72if Tff7b72not Te6edf3reticulumTb4b4b4:
Te6edf3targetloglevel Tff7b72= T79c0ff4Tb4b4b4; Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4; Te6edf3quietness Tff7b72= Te6edf3argsTff7b72.Td2a8ffquiet
Tff7b72if Te6edf3verbosity Tff7b72!= T79c0ff0 Tff7b72or Te6edf3quietness Tff7b72!= T79c0ff0Tb4b4b4: Te6edf3targetloglevel Tff7b72= Te6edf3targetloglevelTff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffcompact_log_fmt Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tff7b72-T79c0ff1
T8b949e#################################
T8b949e# Identity Loading & Resolution #
T8b949e#################################
Tff7b72def Td2a8ffget_operating_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3allow_noneTff7b72=Tff7b72FalseTb4b4b4, Te6edf3no_cacheTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3reticulum
Te6edf3identity Tff7b72= Tff7b72None
Tff7b72if Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffforce Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff already exists. Not overwriting.Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4)Tb4b4b4; Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNew identity Tffd700{Te6edf3identityTffd700}Ta5d6ff written to Tffd700{Te6edf3argsTff7b72.Td2a8ffgenerateTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error ocurred while saving the generated Identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_WRITE_ERRORTb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4:
Te6edf3load_path Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4: Te6edf3load_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
T8b949e# Attempt to load Identity from .rid file
Tff7b72if Te6edf3load_path Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3load_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3load_pathTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLoaded Identity Tffd700{Te6edf3identityTffd700}Ta5d6ff from Tffd700{Te6edf3load_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4) Tff7b72or Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffMissing key data in loaded identityTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load Identity from specified file: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72elif Te6edf3no_cacheTb4b4b4:
Tff7b72if Te6edf3allow_noneTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not resolve identityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
T8b949e# Attempt to recall Identity from hex-encoded hash
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ensure_reticulumTb4b4b4(Te6edf3argsTb4b4b4)
Te6edf3requested_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3argsTff7b72.Td2a8ffidentityTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3requested_hashTb4b4b4) Tff7b72or Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3requested_hashTb4b4b4, Te6edf3from_identity_hashTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3allow_none Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffrequestTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elif Tff7b72not Te6edf3argsTff7b72.Td2a8ffrequestTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not recall Identity for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3requested_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffYou can query the network for unknown Identities with the -R option.Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3id_destination_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Te6edf3DEFAULT_ASPECTSTb4b4b4, Te6edf3requested_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3requested_hashTb4b4b4) T8b949e# Acquire if this was a destination hash
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3id_destination_hashTb4b4b4) T8b949e# Acquire if this was an identity hash
Tff7b72def Td2a8ffspincheckTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3received Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3requested_hashTb4b4b4) Tff7b72or Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3requested_hashTb4b4b4, Te6edf3from_identity_hashTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3received Tff7b72!= Tff7b72None
Te6edf3spinTb4b4b4(Te6edf3spincheckTb4b4b4, Ta5d6ff"Ta5d6ffRequesting unknown Identity for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3requested_hashTb4b4b4)Tb4b4b4, Te6edf3argsTff7b72.Td2a8fftTb4b4b4)
Tff7b72if Tff7b72not Te6edf3spincheckTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity request timed outTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tff7b72not Te6edf3allow_noneTb4b4b4: Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3requested_hashTb4b4b4) Tff7b72or Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3requested_hashTb4b4b4, Te6edf3from_identity_hashTff7b72=Tff7b72TrueTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReceived Identity Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3requested_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from the networkTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ident_str Tff7b72= Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3hash_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3requested_hashTb4b4b4)
Tff7b72if Te6edf3ident_str Tff7b72== Te6edf3hash_strTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRecalled Identity Tffd700{Te6edf3ident_strTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRecalled Identity Tffd700{Te6edf3ident_strTffd700}Ta5d6ff for destination Tffd700{Te6edf3hash_strTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3identity Tff7b72and Te6edf3identityTff7b72.Td2a8ffhashTb4b4b4: Te6edf3reticulumTff7b72.Td2a8ff_retain_identityTb4b4b4(Te6edf3identityTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid hexadecimal hash provided: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffimport_pub Tff7b72or Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4:
Te6edf3prvsize Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETff7b72/Tff7b72/T79c0ff8
Te6edf3pubsize Tff7b72= Te6edf3prvsize
Te6edf3identity_bytes Tff7b72= Tff7b72None
Tff7b72if Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity_bytes Tff7b72= Tff7b72None
Te6edf3import_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3import_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3import_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3file_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3file_input Tff7b72and Tffa657lenTb4b4b4(Te6edf3file_inputTb4b4b4) Tff7b72== Te6edf3pubsizeTb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3file_input
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReticulum Identity imported from Tffd700{Te6edf3import_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4) Tff7b72== Te6edf3pubsizeTff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReticulum Identity imported from hex inputTa5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3b32_decoded Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb32decodeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3b32_decodedTb4b4b4) Tff7b72== Te6edf3pubsizeTb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3b32_decoded
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReticulum Identity imported from base32 inputTa5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3b64_decoded Tff7b72= Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64decodeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3b64_decodedTb4b4b4) Tff7b72== Te6edf3pubsizeTb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3b64_decoded
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReticulum Identity imported from base64 inputTa5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode specified data to a valid public Reticulum IdentityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity data specified for private identity import: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity_bytes Tff7b72= Tff7b72None
Te6edf3import_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3import_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3import_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3file_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3file_input Tff7b72and Tffa657lenTb4b4b4(Te6edf3file_inputTb4b4b4) Tff7b72== Te6edf3prvsizeTb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3file_input
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReticulum Identity imported from Tffd700{Te6edf3import_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4) Tff7b72== Te6edf3prvsizeTff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReticulum Identity imported from hex inputTa5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3b32_decoded Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb32decodeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3b32_decodedTb4b4b4) Tff7b72== Te6edf3prvsizeTb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3b32_decoded
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReticulum Identity imported from base32 inputTa5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3b64_decoded Tff7b72= Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64decodeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3b64_decodedTb4b4b4) Tff7b72== Te6edf3prvsizeTb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3b64_decoded
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReticulum Identity imported from base64 inputTa5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72if Tff7b72not Te6edf3identity_bytesTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode specified data to a valid private Reticulum IdentityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity data specified for private identity import: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffimport_prvTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3identity_bytesTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not create Reticulum identity from specified data: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffimport_pubTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3identityTff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3identity_bytesTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not create Reticulum identity from specified data: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72return Te6edf3identity
T8b949e######################
T8b949e# Network Operations #
T8b949e######################
Tff7b72def Td2a8ffannounceTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ensure_reticulumTb4b4b4(Te6edf3argsTb4b4b4)
Te6edf3aspects Tff7b72= Te6edf3argsTff7b72.Td2a8ffannounceTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3aspectsTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination aspects specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ASPECTSTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3app_name Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4; Te6edf3aspects Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCannot announce this destination, since the private key is not heldTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PRVKEYTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAnnouncing Tffd700{Te6edf3argsTff7b72.Td2a8ffannounceTffd700}Ta5d6ff destination Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff for identity Tffd700{Te6edf3identityTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error ocurred while attempting to send the announce: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
T8b949e########################################
T8b949e# Canonical RSG Manipulation Functions #
T8b949e########################################
Tff7b72def Td2a8ffget_rsg_dataTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Te6edf3rsg_data Tff7b72= Tff7b72None
Tff7b72if Tffa657typeTb4b4b4(Te6edf3rsgTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3rsg_data Tff7b72= Te6edf3rsg
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3rsgTb4b4b4) Tff7b72== Te6edf3ioTff7b72.Td2a8ffBufferedReaderTb4b4b4: Te6edf3rsg_data Tff7b72= Te6edf3rsgTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3rsgTb4b4b4) Tff7b72== Tffa657strTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3rsg_data Tff7b72= Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64decodeTb4b4b4(Te6edf3rsgTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72tryTb4b4b4: Te6edf3rsg_data Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb32decodeTb4b4b4(Te6edf3rsgTff7b72.Td2a8ffstripTb4b4b4(Te6edf3RSG_PADDINGTb4b4b4)Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72tryTb4b4b4: Te6edf3rsg_data Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3rsgTff7b72.Td2a8ffstripTb4b4b4(Te6edf3RSG_PADDINGTb4b4b4)Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72tryTb4b4b4: Te6edf3rsg_data Tff7b72= Te6edf3RNSTff7b72.Td2a8ffb256_to_bytesTb4b4b4(Te6edf3rsgTff7b72.Td2a8ffstripTb4b4b4(Te6edf3RSG_PADDINGTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72return Te6edf3rsg_data
Tff7b72def Td2a8ffextract_signed_rsg_dataTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Te6edf3siglen Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8
Te6edf3rsg_data Tff7b72= Te6edf3get_rsg_dataTb4b4b4(Te6edf3rsgTb4b4b4)
Te6edf3envelope Tff7b72= Te6edf3rsg_dataTb4b4b4[Te6edf3siglenTb4b4b4:Tb4b4b4]
Tff7b72tryTb4b4b4: Tff7b72return Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3envelopeTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72None
Tff7b72def Td2a8ffget_rsg_hashTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4:
Te6edf3sha Tff7b72= Tff7b72None
Tff7b72if Tffa657typeTb4b4b4(Te6edf3messageTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3sha Tff7b72= Te6edf3sha256Tb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3messageTb4b4b4) Tff7b72== Tffa657strTb4b4b4: Te6edf3sha Tff7b72= Te6edf3sha256Tb4b4b4(Te6edf3messageTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3messageTb4b4b4) Tff7b72== Te6edf3ioTff7b72.Td2a8ffBufferedReaderTb4b4b4: Te6edf3sha Tff7b72= Te6edf3file_sha256Tb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid input type Tffd700{Tffa657typeTb4b4b4(Te6edf3messageTb4b4b4)Tffd700}Ta5d6ff for rsg creationTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3shaTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffHash calculation for rsg signature input failedTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3sha
Tff7b72def Td2a8ffrsg_is_legacy_formatTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Te6edf3rsg_data Tff7b72= Te6edf3get_rsg_dataTb4b4b4(Te6edf3rsgTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rsg_dataTb4b4b4: Tff7b72return Tff7b72False
Tff7b72return Tff7b72True Tff7b72if Tffa657lenTb4b4b4(Te6edf3rsg_dataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8 Tff7b72else Tff7b72False
Tff7b72def Td2a8ffvalidate_rsgTb4b4b4(Te6edf3rsgTb4b4b4, Te6edf3messageTff7b72=Tff7b72NoneTb4b4b4, Te6edf3required_signerTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3messageTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo message specified for rsg validationTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657typeTb4b4b4(Te6edf3required_signerTb4b4b4) Tff7b72in Tb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4, Tffa657bytesTb4b4b4, Tffa657typeTb4b4b4(Tff7b72NoneTb4b4b4)Tb4b4b4]Tb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid required signer type Tffd700{Tffa657typeTb4b4b4(Te6edf3required_signerTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3required_signerTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4: Te6edf3required_signer_hash Tff7b72= Te6edf3required_signerTff7b72.Td2a8ffhash
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3required_signerTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3required_signer_hash Tff7b72= Te6edf3required_signer
Tff7b72elseTb4b4b4: Te6edf3required_signer_hash Tff7b72= Tff7b72None
Te6edf3siglen Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8
Te6edf3rsg_data Tff7b72= Te6edf3get_rsg_dataTb4b4b4(Te6edf3rsgTb4b4b4)
Te6edf3rsg_hash Tff7b72= Te6edf3get_rsg_hashTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rsg_dataTb4b4b4) Tff7b72== Te6edf3siglenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot validate legacy rsg formatTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3rsg_dataTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rsg_dataTb4b4b4) Tff7b72< Te6edf3siglenTff7b72+T79c0ff1Tb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3signing_identity Tff7b72= Tff7b72None
Te6edf3signature Tff7b72= Te6edf3rsg_dataTb4b4b4[Tb4b4b4:Te6edf3siglenTb4b4b4]
Te6edf3envelope Tff7b72= Te6edf3rsg_dataTb4b4b4[Te6edf3siglenTb4b4b4:Tb4b4b4]
Tff7b72tryTb4b4b4: Te6edf3signed_data Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3envelopeTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffhashtypeTa5d6ff" Tff7b72in Te6edf3signed_data Tff7b72or Tff7b72not Ta5d6ff"Ta5d6ffhashTa5d6ff" Tff7b72in Te6edf3signed_dataTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Tff7b72not Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffhashtypeTa5d6ff"Tb4b4b4] Tff7b72in Te6edf3RSG_HASHTYPESTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmetaTa5d6ff" Tff7b72in Te6edf3signed_dataTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffsignerTa5d6ff" Tff7b72in Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffpubkeyTa5d6ff" Tff7b72in Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3required_signerTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4:
Te6edf3signing_identity Tff7b72= Te6edf3required_signer
Tff7b72elseTb4b4b4:
Te6edf3signing_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Te6edf3create_keysTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3signing_identityTff7b72.Td2a8ffload_public_keyTb4b4b4(Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpubkeyTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Te6edf3required_signer_hash Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3required_signer_hash Tff7b72= Te6edf3signing_identityTff7b72.Td2a8ffhash
Tff7b72if Tff7b72not Te6edf3signing_identityTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72None
Tff7b72if Tff7b72not Te6edf3signing_identityTff7b72.Td2a8ffhash Tff7b72== Te6edf3required_signer_hashTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3signing_identity
Tff7b72if Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4] Tff7b72!= Te6edf3rsg_hashTb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3signing_identity
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3signing_identityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3envelopeTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72FalseTb4b4b4, Te6edf3signed_dataTb4b4b4, Te6edf3signing_identity
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72TrueTb4b4b4, Te6edf3signed_dataTb4b4b4, Te6edf3signing_identity
Tff7b72return Tff7b72FalseTb4b4b4, Te6edf3signed_dataTb4b4b4, Te6edf3signing_identity
Tff7b72def Td2a8ffcreate_rsgTb4b4b4(Te6edf3signer_identityTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3embedTff7b72=Tff7b72FalseTb4b4b4, Te6edf3metaTff7b72=Tff7b72NoneTb4b4b4, Te6edf3outputTff7b72=Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3output Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhexTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase32Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase256Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase64Ta5d6ff"Tb4b4b4]Tb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid output format for rsg creationTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657typeTb4b4b4(Te6edf3signer_identityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3signer_identityTffd700}Ta5d6ff is not a Reticulum IdentityTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3signer_identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3signer_identityTffd700}Ta5d6ff does not hold a private keyTa5d6ff"Tb4b4b4)
Te6edf3signed_data Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffhashtypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsha256Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3get_rsg_hashTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4: Tb4b4b4{ Ta5d6ff"Ta5d6ffsignerTa5d6ff"Tb4b4b4: Te6edf3signer_identityTff7b72.Td2a8ffhashTb4b4b4,
Ta5d6ff"Ta5d6ffpubkeyTa5d6ff"Tb4b4b4: Te6edf3signer_identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72if Te6edf3embedTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3messageTb4b4b4) Tff7b72== Tffa657strTb4b4b4: Te6edf3message Tff7b72= Te6edf3messageTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3message
Tff7b72if Te6edf3meta Tff7b72and Tffa657typeTb4b4b4(Te6edf3metaTb4b4b4) Tff7b72== Tffa657dictTb4b4b4:
Tff7b72for Te6edf3key Tff7b72in Te6edf3metaTb4b4b4:
Tff7b72if Tff7b72not Te6edf3key Tff7b72in Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3metaTb4b4b4[Te6edf3keyTb4b4b4]
Te6edf3envelope Tff7b72= Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3signed_dataTb4b4b4)
Te6edf3signature Tff7b72= Te6edf3signer_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3envelopeTb4b4b4)
Te6edf3rsg_data Tff7b72= Te6edf3signatureTff7b72+Te6edf3envelope
Tff7b72if Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4: Te6edf3rsg Tff7b72= Te6edf3rsg_data
Tff7b72elif Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffhexTa5d6ff"Tb4b4b4: Te6edf3rsg Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3rsg_dataTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbase32Ta5d6ff"Tb4b4b4: Te6edf3rsg Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3rsg_dataTb4b4b4)
Tff7b72elif Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbase64Ta5d6ff"Tb4b4b4: Te6edf3rsg Tff7b72= Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3rsg_dataTb4b4b4)
Tff7b72elif Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbase256Ta5d6ff"Tb4b4b4: Te6edf3rsg Tff7b72= Te6edf3RNSTff7b72.Td2a8ffb256repTb4b4b4(Te6edf3rsg_dataTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72return Te6edf3rsg
Te6edf3RSG_ASCII_HEADER Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff#### Start of rsg data Ta5d6ff"
Te6edf3RSG_ASCII_FOOTER Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff End of rsg data ####Ta5d6ff"
Te6edf3RSG_ASCII_ROW_WIDTH Tff7b72= T79c0ff64
Te6edf3RSG_PADDING Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff=Ta5d6ff"
Tff7b72def Td2a8ffwrap_rsgTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3rsgTb4b4b4) Tff7b72== Tffa657strTb4b4b4: Tff7b72return Te6edf3wrap_rsg_strTb4b4b4(Te6edf3rsgTb4b4b4)
Tff7b72def Td2a8ffpadTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3chunkTff7b72+Tb4b4b4(Te6edf3RSG_ASCII_ROW_WIDTHTff7b72-Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)Tff7b72*Te6edf3RSG_PADDING
Te6edf3header Tff7b72= Te6edf3RSG_ASCII_HEADERTff7b72+Ta5d6ffbTa5d6ff"Ta5d6ff#Ta5d6ff"Tff7b72*Tb4b4b4(Te6edf3RSG_ASCII_ROW_WIDTHTff7b72-Tffa657lenTb4b4b4(Te6edf3RSG_ASCII_HEADERTb4b4b4)Tb4b4b4)
Te6edf3footer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff#Ta5d6ff"Tff7b72*Tb4b4b4(Te6edf3RSG_ASCII_ROW_WIDTHTff7b72-Tffa657lenTb4b4b4(Te6edf3RSG_ASCII_FOOTERTb4b4b4)Tb4b4b4)Tff7b72+Te6edf3RSG_ASCII_FOOTER
Te6edf3wrapped Tff7b72= Te6edf3headerTff7b72+Ta5d6ffbTa5d6ff"Tffea00\nTa5d6ff"
Te6edf3read Tff7b72= T79c0ff0
Tff7b72while Tffa657lenTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3rsgTb4b4b4[Tb4b4b4:Te6edf3RSG_ASCII_ROW_WIDTHTb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4) Tff7b72< Te6edf3RSG_ASCII_ROW_WIDTHTb4b4b4: Te6edf3chunk Tff7b72= Te6edf3padTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3wrapped Tff7b72+Tff7b72= Te6edf3chunkTff7b72+Ta5d6ffbTa5d6ff"Tffea00\nTa5d6ff"Tb4b4b4; Te6edf3read Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3rsg Tff7b72= Te6edf3rsgTb4b4b4[Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4:Tb4b4b4]
Te6edf3wrapped Tff7b72+Tff7b72= Te6edf3footer
Tff7b72return Te6edf3wrappedTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffwrap_rsg_strTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffpadTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3chunkTff7b72+Tb4b4b4(Te6edf3RSG_ASCII_ROW_WIDTHTff7b72-Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)Tff7b72*Te6edf3RSG_PADDINGTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3header Tff7b72= Te6edf3RSG_ASCII_HEADERTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff#Ta5d6ff"Tff7b72*Tb4b4b4(Te6edf3RSG_ASCII_ROW_WIDTHTff7b72-Tffa657lenTb4b4b4(Te6edf3RSG_ASCII_HEADERTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3footer Tff7b72= Ta5d6ff"Ta5d6ff#Ta5d6ff"Tff7b72*Tb4b4b4(Te6edf3RSG_ASCII_ROW_WIDTHTff7b72-Tffa657lenTb4b4b4(Te6edf3RSG_ASCII_FOOTERTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)Tff7b72+Te6edf3RSG_ASCII_FOOTERTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3wrapped Tff7b72= Te6edf3headerTff7b72+Ta5d6ff"Tffea00\nTa5d6ff"
Te6edf3read Tff7b72= T79c0ff0
Tff7b72while Tffa657lenTb4b4b4(Te6edf3rsgTb4b4b4)Tb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3rsgTb4b4b4[Tb4b4b4:Te6edf3RSG_ASCII_ROW_WIDTHTb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4) Tff7b72< Te6edf3RSG_ASCII_ROW_WIDTHTb4b4b4: Te6edf3chunk Tff7b72= Te6edf3padTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3wrapped Tff7b72+Tff7b72= Te6edf3chunkTff7b72+Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4; Te6edf3read Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3rsg Tff7b72= Te6edf3rsgTb4b4b4[Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4:Tb4b4b4]
Te6edf3wrapped Tff7b72+Tff7b72= Te6edf3footer
Tff7b72return Te6edf3wrapped
Tff7b72def Td2a8ffunwrap_rsgTb4b4b4(Te6edf3wrapped_rsgTb4b4b4)Tb4b4b4:
Te6edf3unwrapped Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Tffa657typeTb4b4b4(Te6edf3wrapped_rsgTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3wrapped_rsg Tff7b72= Te6edf3wrapped_rsgTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3wrapped_rsgTb4b4b4) Tff7b72== Tffa657strTb4b4b4: Tff7b72pass
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72for Te6edf3line Tff7b72in Te6edf3wrapped_rsgTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue
Tff7b72if Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff#Ta5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72continue
Te6edf3unwrapped Tff7b72+Tff7b72= Te6edf3line
Tff7b72return Te6edf3unwrapped Tff7b72if Te6edf3unwrapped Tff7b72else Tff7b72None
Tff7b72def Td2a8ffrsg_meta_from_fileTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3spec_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3spec_pathTb4b4b4: Te6edf3meta_spec Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3spec_pathTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3meta_spec Tff7b72= Tff7b72None
Te6edf3parsed Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3configspecTff7b72=Te6edf3meta_specTb4b4b4)
Tff7b72if Te6edf3meta_specTb4b4b4:
Te6edf3validation Tff7b72= Te6edf3parsedTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3ValidatorTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3validation Tff7b72== Tff7b72TrueTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffMetadata did not pass spec validationTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3parsedTff7b72.Td2a8ffdictTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffrsg_meta_from_strTb4b4b4(Te6edf3metaTb4b4b4, Te6edf3specTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3specTb4b4b4: Te6edf3meta_spec Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3specTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3meta_spec Tff7b72= Tff7b72None
Te6edf3parsed Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3metaTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3configspecTff7b72=Te6edf3meta_specTb4b4b4)
Tff7b72if Te6edf3meta_specTb4b4b4:
Te6edf3validation Tff7b72= Te6edf3parsedTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3ValidatorTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3validation Tff7b72== Tff7b72TrueTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffMetadata did not pass spec validationTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3parsedTff7b72.Td2a8ffdictTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcheck_release_rsm_structureTb4b4b4(Te6edf3signed_dataTb4b4b4)Tb4b4b4:
Te6edf3release_meta Tff7b72= Te6edf3signed_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Tff7b72not Te6edf3release_metaTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffNo release metadata in manifestTa5d6ff"
Te6edf3release_name Tff7b72= Te6edf3release_metaTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3release_version Tff7b72= Te6edf3release_metaTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3release_origin Tff7b72= Te6edf3release_metaTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fforiginTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3release_origin_path Tff7b72= Te6edf3release_metaTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Tff7b72not Te6edf3release_name Tff7b72or Tff7b72not Te6edf3release_versionTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffIncomplete package data in manifestTa5d6ff"
Tff7b72if Tff7b72not Te6edf3release_origin Tff7b72or Tff7b72not Te6edf3release_origin_pathTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffIncomplete release origin data in manifestTa5d6ff"
Tff7b72if Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72in Te6edf3release_name Tff7b72or Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72in Te6edf3release_versionTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffInvalid data in release manifestTa5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3release_originTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffInvalid origin hash length in manifestTa5d6ff"
Tff7b72if Tff7b72not Tffa657typeTb4b4b4(Te6edf3release_originTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffInvalid origin hash in manifestTa5d6ff"
Tff7b72return Tff7b72True
T8b949e###################################
T8b949e# Signing & Validation Operations #
T8b949e###################################
Tff7b72def Td2a8ffvalidateTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Te6edf3paths Tff7b72= Te6edf3argsTff7b72.Td2a8ffvalidateTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3validated Tff7b72= T79c0ff0
Tff7b72for Te6edf3path Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffvalidate Tff7b72= Te6edf3path
Te6edf3code Tff7b72= Te6edf3validateTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3code Tff7b72!= T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive signature validationTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3validated Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tffa657lenTb4b4b4(Te6edf3pathsTb4b4b4) Tff7b72!= Te6edf3validatedTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive signature validationTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Te6edf3msg_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3MSG_EXTTffd700}Ta5d6ff"
Te6edf3sig_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3SIG_EXTTffd700}Ta5d6ff"
Te6edf3validate_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)
Te6edf3path_is_msgfile Tff7b72= Te6edf3validate_pathTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Te6edf3msg_extTb4b4b4)
Te6edf3path_is_sigfile Tff7b72= Te6edf3validate_pathTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Te6edf3sig_extTb4b4b4)
Tff7b72if Te6edf3path_is_sigfileTb4b4b4: Te6edf3signature_path Tff7b72= Te6edf3validate_pathTb4b4b4; Te6edf3file_path Tff7b72= Te6edf3validate_pathTb4b4b4[Tb4b4b4:Tff7b72-Tffa657lenTb4b4b4(Te6edf3sig_extTb4b4b4)Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3signature_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3validate_pathTffd700}Tffd700{Te6edf3sig_extTffd700}Ta5d6ff"Tb4b4b4; Te6edf3file_path Tff7b72= Te6edf3validate_path
Te6edf3signature_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3signature_pathTb4b4b4)
Te6edf3file_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)
Tff7b72if Te6edf3path_is_msgfileTb4b4b4: Tff7b72return Te6edf3validate_messageTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Te6edf3__recursiveTb4b4b4)
Tff7b72if Tff7b72not Te6edf3file_existsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe validation target Tffea00\"Tffd700{Te6edf3file_pathTffd700}Tffea00\"Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72if Tff7b72not Te6edf3signature_existsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo signature file exists for Tffea00\"Tffd700{Te6edf3file_pathTffd700}Tffea00\"Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3signature_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3is_legacy_format Tff7b72= Te6edf3rsg_is_legacy_formatTb4b4b4(Te6edf3fhTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not detect rsg format: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72if Tff7b72not Te6edf3is_legacy_formatTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3signature_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3rsg Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not read rsg: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657strTb4b4b4:
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity hash lengthTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3identity Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identityTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid identity hash: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3validTb4b4b4, Te6edf3signed_dataTb4b4b4, Te6edf3signing_identity Tff7b72= Te6edf3validate_rsgTb4b4b4(Te6edf3rsgTb4b4b4, Te6edf3messageTff7b72=Te6edf3fhTb4b4b4, Te6edf3required_signerTff7b72=Te6edf3identityTb4b4b4)
Te6edf3identity_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657bytes Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3identityTffd700}Ta5d6ff"
Te6edf3signer_description Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffThis file was NOT signed by Tffd700{Te6edf3identity_str Tff7b72or Te6edf3signing_identityTffd700}Ta5d6ff" Tff7b72if Te6edf3identity Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3validTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid signature Tffd700{Te6edf3signature_pathTffd700}Ta5d6ff for file Tffd700{Te6edf3file_pathTffd700}Tffd700{Te6edf3signer_descriptionTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_SIGNATURETb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSignature is valid, the file Tffd700{Te6edf3file_pathTffd700}Ta5d6ff was signed by Tffd700{Te6edf3signing_identityTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Tff7b72return Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4) Tff7b72if Tff7b72not Te6edf3__recursive Tff7b72else Te6edf3R_OK
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while validating Tffd700{Te6edf3signature_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not read Tffd700{Te6edf3file_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot validate legacy rsg signatures without an explicit required identityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3signature_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3signature Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not read signature: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3valid Tff7b72= Te6edf3identityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3validTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid signature Tffd700{Te6edf3signature_pathTffd700}Ta5d6ff for file Tffd700{Te6edf3file_pathTffd700}Tffea00\nTa5d6ffThis file was NOT signed by Tffd700{Te6edf3identityTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_SIGNATURETb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSignature is valid, the file Tffd700{Te6edf3file_pathTffd700}Ta5d6ff was signed by Tffd700{Te6edf3identityTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not validate signature: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72def Td2a8ffvalidate_messageTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3msg_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3MSG_EXTTffd700}Ta5d6ff"
Te6edf3validate_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)
Te6edf3path_is_msgfile Tff7b72= Te6edf3validate_pathTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Te6edf3msg_extTb4b4b4)
Tff7b72if Te6edf3path_is_msgfileTb4b4b4: Te6edf3signature_path Tff7b72= Te6edf3validate_path
Te6edf3signature_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3signature_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3signature_existsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe signature file Tffea00\"Tffd700{Te6edf3signature_pathTffd700}Tffea00\"Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3signature_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3rsg Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not read rsg: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657strTb4b4b4:
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity hash lengthTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3identity Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identityTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid identity hash: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3rsm_contents Tff7b72= Te6edf3extract_signed_rsg_dataTb4b4b4(Te6edf3rsgTb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmessageTa5d6ff" Tff7b72in Te6edf3rsm_contentsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo embedded message in Tffd700{Te6edf3signature_pathTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_SIGNATURETb4b4b4)
Te6edf3validTb4b4b4, Te6edf3signed_dataTb4b4b4, Te6edf3signing_identity Tff7b72= Te6edf3validate_rsgTb4b4b4(Te6edf3rsgTb4b4b4, Te6edf3messageTff7b72=Te6edf3rsm_contentsTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3required_signerTff7b72=Te6edf3identityTb4b4b4)
Te6edf3identity_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657bytes Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3identityTffd700}Ta5d6ff"
Te6edf3signer_description Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffThe message was NOT signed by Tffd700{Te6edf3identity_str Tff7b72or Te6edf3signing_identityTffd700}Ta5d6ff" Tff7b72if Te6edf3identity Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3validTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid signature in Tffd700{Te6edf3signature_pathTffd700}Tffd700{Te6edf3signer_descriptionTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_SIGNATURETb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffmetaTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRSM MetadataTffea00\nTa5d6ff============Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrecurseTb4b4b4(Te6edf3entryTb4b4b4, Te6edf3keyTb4b4b4, Te6edf3levelTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3indent Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Te6edf3level
Tff7b72if Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657dictTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffdTffd700{Te6edf3indentTffd700}Tffd700{Te6edf3keyTffd700}Ta5d6ff:Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3key Tff7b72in Te6edf3entryTb4b4b4: Te6edf3recurseTb4b4b4(Te6edf3entryTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4, Te6edf3keyTb4b4b4, Te6edf3levelTff7b72=Te6edf3levelTff7b72+T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3maxwidth Tff7b72= T79c0ff64
Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6ffuTa5d6ff"
Tff7b72if Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657strTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6ffbTa5d6ff"
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657listTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6fflTa5d6ff"
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657dictTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6ffdTa5d6ff"
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657intTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6ffiTa5d6ff"
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657floatTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6fffTa5d6ff"
Tff7b72elif Te6edf3entry Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3etype Tff7b72= Ta5d6ff"Ta5d6ffNTa5d6ff"
Tff7b72if Te6edf3key Tff7b72== Ta5d6ff"Ta5d6ffnoteTa5d6ff" Tff7b72and Te6edf3entry Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return T8b949e# TODO: Remove this check in 1.3.3
Tff7b72if Tffa657typeTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3entry Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3entryTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3leadin Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3etypeTffd700}Tffd700{Te6edf3indentTffd700}Tffd700{Te6edf3keyTffd700}Ta5d6ff=Ta5d6ff"Tb4b4b4; Te6edf3leadln Tff7b72= Tffa657lenTb4b4b4(Te6edf3leadinTb4b4b4)
Te6edf3entry Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3entryTffd700}Ta5d6ff"Tb4b4b4; Te6edf3chunk Tff7b72= Te6edf3entryTb4b4b4[Tb4b4b4:Te6edf3maxwidthTb4b4b4]Tb4b4b4; Te6edf3entry Tff7b72= Te6edf3entryTb4b4b4[Te6edf3maxwidthTb4b4b4:Tb4b4b4]
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3leadinTffd700}Tffd700{Te6edf3chunkTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4: Te6edf3chunk Tff7b72= Te6edf3entryTb4b4b4[Tb4b4b4:Te6edf3maxwidthTb4b4b4]Tb4b4b4; Te6edf3entry Tff7b72= Te6edf3entryTb4b4b4[Te6edf3maxwidthTb4b4b4:Tb4b4b4]Tb4b4b4; Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Te6edf3leadlnTff7b72+Te6edf3chunkTb4b4b4)
Tff7b72exceptTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffETffd700{Te6edf3indentTffd700}Tffd700{Te6edf3keyTffd700}Ta5d6ff=<Decode Error>Ta5d6ff"Tb4b4b4)
Te6edf3meta Tff7b72= Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4]
Tff7b72for Te6edf3key Tff7b72in Te6edf3metaTb4b4b4: Te6edf3entry Tff7b72= Te6edf3metaTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4; Te6edf3recurseTb4b4b4(Te6edf3entryTb4b4b4, Te6edf3keyTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffValidationTffea00\nTa5d6ff==========Ta5d6ff"Tb4b4b4)
Te6edf3c Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff" Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffmeta Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3f Tff7b72= Ta5d6ff"Ta5d6ff followingTa5d6ff" Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffmeta Tff7b72else Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffSignature is valid, theTffd700{Te6edf3fTffd700}Ta5d6ff message was signed by Tffd700{Te6edf3signing_identityTffd700}Tffd700{Te6edf3cTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffmetaTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffMessageTffea00\nTa5d6ff=======Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Te6edf3signed_dataTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4) Tff7b72if Tff7b72not Te6edf3__recursive Tff7b72else Te6edf3R_OK
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while validating Tffd700{Te6edf3signature_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72def Td2a8ffsignTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Te6edf3paths Tff7b72= Te6edf3argsTff7b72.Td2a8ffsignTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3signed Tff7b72= T79c0ff0
Tff7b72for Te6edf3path Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffsign Tff7b72= Te6edf3path
Te6edf3code Tff7b72= Te6edf3signTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3code Tff7b72!= T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive signature creationTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3signed Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tffa657lenTb4b4b4(Te6edf3pathsTb4b4b4) Tff7b72!= Te6edf3signedTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive signature creationTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Te6edf3sig_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3SIG_EXTTffd700}Ta5d6ff"
Te6edf3sign_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4)
Te6edf3rsg_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3sign_pathTffd700}Tffd700{Te6edf3sig_extTffd700}Ta5d6ff"
Te6edf3file_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3sign_pathTb4b4b4)
Te6edf3signature_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3rsg_pathTb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbase32Ta5d6ff"
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbase64Ta5d6ff"
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase256Tb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbase256Ta5d6ff"
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffhexTb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffhexTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbinTa5d6ff"
Tff7b72if Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot sign Tffea00\"Tffd700{Te6edf3sign_pathTffd700}Tffea00\"Ta5d6ff, the identity does not hold a private keyTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PRVKEYTb4b4b4)
Tff7b72if Tff7b72not Te6edf3file_existsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe file Tffea00\"Tffd700{Te6edf3sign_pathTffd700}Tffea00\"Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72if Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbinTa5d6ff" Tff7b72and Te6edf3signature_exists Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe signature file Tffea00\"Tffd700{Te6edf3rsg_pathTffd700}Tffea00\"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffrawTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3sign_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3data Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3rsg_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3sign_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3in_fileTb4b4b4: Te6edf3rsg Tff7b72= Te6edf3create_rsgTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3in_fileTb4b4b4, Te6edf3outputTff7b72=Te6edf3outputTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rsgTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo signature created, not writingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72if Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3rsg_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3out_fileTb4b4b4: Te6edf3out_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3rsgTb4b4b4)
Tff7b72elif Te6edf3output Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffbase32Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase64Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase256Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhexTa5d6ff"Tb4b4b4]Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3wrap_rsgTb4b4b4(Te6edf3rsgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo valid output format specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ARGSTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSigned file Tffd700{Te6edf3sign_pathTffd700}Ta5d6ff with Tffd700{Te6edf3identityTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Tff7b72return Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4) Tff7b72if Tff7b72not Te6edf3__recursive Tff7b72else Te6edf3R_OK
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not sign Tffd700{Te6edf3sign_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72def Td2a8ffsign_messageTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Te6edf3message Tff7b72= Te6edf3argsTff7b72.Td2a8ffsign_message
Te6edf3meta Tff7b72= Tff7b72None
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbase32Ta5d6ff"
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbase64Ta5d6ff"
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase256Tb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbase256Ta5d6ff"
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffhexTb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffhexTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3output Tff7b72= Ta5d6ff"Ta5d6ffbinTa5d6ff"
Tff7b72if Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbinTa5d6ff" Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo write path specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ARGSTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot sign, no working identity availableTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot sign, the identity does not hold a private keyTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PRVKEYTb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Tff7b72if Te6edf3message Tff7b72!= Te6edf3NO_MESSAGETb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffBoth an input file and command-line provided message was specified, abortingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ARGSTb4b4b4)
Te6edf3sign_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3sign_pathTb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe file Tffd700{Te6edf3sign_pathTffd700}Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3sign_pathTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3message Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3message Tff7b72== Te6edf3NO_MESSAGETb4b4b4: Te6edf3message Tff7b72= Te6edf3get_editor_contentTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3messageTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo message specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ARGSTb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffembed_metaTb4b4b4:
Te6edf3meta_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffembed_metaTb4b4b4)
Te6edf3meta_spec_path Tff7b72= Te6edf3meta_pathTff7b72+Ta5d6ff"Ta5d6ff.specTa5d6ff" Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffmeta_spec Tff7b72else Te6edf3argsTff7b72.Td2a8ffmeta_spec
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3meta_pathTb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMetadata file Tffd700{Te6edf3meta_pathTffd700}Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3meta_spec_pathTb4b4b4)Tb4b4b4: Te6edf3meta_spec_path Tff7b72= Tff7b72None
Te6edf3spec_info Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff using spec from Tffd700{Te6edf3meta_spec_pathTffd700}Ta5d6ff" Tff7b72if Te6edf3meta_spec_path Tff7b72else Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEmbedding metadata from Tffd700{Te6edf3meta_pathTffd700}Tffd700{Te6edf3spec_infoTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3meta Tff7b72= Te6edf3rsg_meta_from_fileTb4b4b4(Te6edf3meta_pathTb4b4b4, Te6edf3spec_pathTff7b72=Te6edf3meta_spec_pathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load metadata from Tffd700{Te6edf3meta_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3rsg Tff7b72= Te6edf3create_rsgTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3embedTff7b72=Tff7b72TrueTb4b4b4, Te6edf3metaTff7b72=Te6edf3metaTb4b4b4, Te6edf3outputTff7b72=Te6edf3outputTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rsgTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo signature created, not writingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72if Te6edf3output Tff7b72== Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4:
Te6edf3sig_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3MSG_EXTTffd700}Ta5d6ff"
Te6edf3rsg_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)
Te6edf3rsg_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3rsg_pathTffd700}Tffd700{Te6edf3sig_extTffd700}Ta5d6ff" Tff7b72if Tff7b72not Te6edf3rsg_pathTff7b72.Td2a8ffendswithTb4b4b4(Te6edf3sig_extTb4b4b4) Tff7b72else Te6edf3rsg_path
Te6edf3signature_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3rsg_pathTb4b4b4)
Tff7b72if Te6edf3signature_exists Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe signature file Tffea00\"Tffd700{Te6edf3rsg_pathTffd700}Tffea00\"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3rsg_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3out_fileTb4b4b4: Te6edf3out_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3rsgTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMessage signed with Tffd700{Te6edf3identityTffd700}Ta5d6ff saved to Tffd700{Te6edf3rsg_pathTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Tff7b72elif Te6edf3output Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffbase32Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase64Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbase256Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhexTa5d6ff"Tb4b4b4]Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3wrap_rsgTb4b4b4(Te6edf3rsgTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo valid output format specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ARGSTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMessage signed with Tffd700{Te6edf3identityTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not sign message: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
T8b949e######################################
T8b949e# Encryption & Decryption Operations #
T8b949e######################################
Tff7b72def Td2a8ffencryptTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Te6edf3paths Tff7b72= Te6edf3argsTff7b72.Td2a8ffencryptTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3encrypted Tff7b72= T79c0ff0
Tff7b72for Te6edf3path Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffencrypt Tff7b72= Te6edf3path
Te6edf3code Tff7b72= Te6edf3encryptTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3code Tff7b72!= T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive file encryptionTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3encrypted Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tffa657lenTb4b4b4(Te6edf3pathsTb4b4b4) Tff7b72!= Te6edf3encryptedTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive file encryptionTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Te6edf3enc_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3ENCRYPT_EXTTffd700}Ta5d6ff"
Te6edf3encrypt_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4)
Te6edf3rfe_path Tff7b72= Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72if Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3encrypt_pathTffd700}Tffd700{Te6edf3enc_extTffd700}Ta5d6ff"
Te6edf3file_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3encrypt_pathTb4b4b4)
Te6edf3rfe_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3rfe_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot encrypt Tffea00\"Tffd700{Te6edf3encrypt_pathTffd700}Tffea00\"Ta5d6ff, no identity specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot encrypt Tffea00\"Tffd700{Te6edf3encrypt_pathTffd700}Tffea00\"Ta5d6ff, the identity does not hold a public keyTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PUBKEYTb4b4b4)
Tff7b72if Tff7b72not Te6edf3file_existsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe file Tffea00\"Tffd700{Te6edf3encrypt_pathTffd700}Tffea00\"Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72if Te6edf3rfe_exists Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe encryption output file Tffea00\"Tffd700{Te6edf3rfe_pathTffd700}Tffea00\"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3encrypt_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3input_fhTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3rfe_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3output_fhTb4b4b4:
Te6edf3wrote Tff7b72= T79c0ff0
Te6edf3data_remaining Tff7b72= Tff7b72True
Tff7b72while Te6edf3data_remainingTb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3input_fhTff7b72.Td2a8ffreadTb4b4b4(Te6edf3ENC_CHUNKTb4b4b4)
Tff7b72if Te6edf3chunkTb4b4b4: Te6edf3wrote Tff7b72+Tff7b72= Te6edf3output_fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3identityTff7b72.Td2a8ffencryptTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3data_remaining Tff7b72= Tff7b72False
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTa5d6ffWrote Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3wroteTb4b4b4)Tffd700}Ta5d6ff to Tffd700{Te6edf3rfe_pathTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffError writing encrypted output to Tffd700{Te6edf3rfe_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_WRITE_ERRORTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffError reading Tffd700{Te6edf3encrypt_pathTffd700}Ta5d6ff for encryption: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_WRITE_ERRORTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffFile Tffd700{Te6edf3encrypt_pathTffd700}Ta5d6ff encrypted for Tffd700{Te6edf3identityTffd700}Ta5d6ff to Tffd700{Te6edf3rfe_pathTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Tff7b72return Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4) Tff7b72if Tff7b72not Te6edf3__recursive Tff7b72else Te6edf3R_OK
Tff7b72def Td2a8ffdecryptTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Te6edf3paths Tff7b72= Te6edf3argsTff7b72.Td2a8ffdecryptTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3decrypted Tff7b72= T79c0ff0
Tff7b72for Te6edf3path Tff7b72in Te6edf3pathsTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffdecrypt Tff7b72= Te6edf3path
Te6edf3code Tff7b72= Te6edf3decryptTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3__recursiveTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3code Tff7b72!= T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive file decryptionTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3decrypted Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tffa657lenTb4b4b4(Te6edf3pathsTb4b4b4) Tff7b72!= Te6edf3decryptedTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSequence error on recursive file decryptionTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_SEQUENCE_ERRORTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4)
Te6edf3enc_ext Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3ENCRYPT_EXTTffd700}Ta5d6ff"
Te6edf3rfe_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rfe_pathTff7b72.Td2a8ffendswithTb4b4b4(Te6edf3enc_extTb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe file Tffd700{Te6edf3rfe_pathTffd700}Ta5d6ff does not appear to be a Reticulum encrypted fileTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_FILETb4b4b4)
Te6edf3decrypt_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4) Tff7b72if Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3rfe_pathTb4b4b4[Tb4b4b4:Tff7b72-Tffa657lenTb4b4b4(Te6edf3enc_extTb4b4b4)Tb4b4b4]Tffd700}Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3decrypt_pathTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid output filenameTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_FILETb4b4b4)
Te6edf3rfe_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3rfe_pathTb4b4b4)
Te6edf3file_exists Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3decrypt_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot decrypt Tffea00\"Tffd700{Te6edf3rfe_pathTffd700}Tffea00\"Ta5d6ff, no identity specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_IDENTITYTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCannot decrypt Tffea00\"Tffd700{Te6edf3rfe_pathTffd700}Tffea00\"Ta5d6ff, the identity does not hold a private keyTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PRVKEYTb4b4b4)
Tff7b72if Tff7b72not Te6edf3rfe_existsTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe file Tffea00\"Tffd700{Te6edf3rfe_pathTffd700}Tffea00\"Ta5d6ff does not existTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_FILETb4b4b4)
Tff7b72if Te6edf3file_exists Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe decryption output file Tffea00\"Tffd700{Te6edf3decrypt_pathTffd700}Tffea00\"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3rfe_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3input_fhTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3decrypt_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3output_fhTb4b4b4:
Te6edf3data_remaining Tff7b72= Tff7b72True
Te6edf3wrote Tff7b72= T79c0ff0
Tff7b72while Te6edf3data_remainingTb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3input_fhTff7b72.Td2a8ffreadTb4b4b4(Te6edf3DEC_CHUNKTb4b4b4)
Tff7b72if Te6edf3chunkTb4b4b4:
Te6edf3decrypted Tff7b72= Te6edf3identityTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3chunkTb4b4b4)
Tff7b72if Tff7b72not Te6edf3decryptedTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe provided identity could not decrypt the fileTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_DECRYPT_FAILEDTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3wrote Tff7b72+Tff7b72= Te6edf3output_fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3decryptedTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTa5d6ffWrote Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3wroteTb4b4b4)Tffd700}Ta5d6ff to Tffd700{Te6edf3decrypt_pathTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3data_remaining Tff7b72= Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffError writing decrypted output to Tffd700{Te6edf3decrypt_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_WRITE_ERRORTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffError reading Tffd700{Te6edf3rfe_pathTffd700}Ta5d6ff for decryption: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_WRITE_ERRORTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffFile Tffd700{Te6edf3rfe_pathTffd700}Ta5d6ff decrypted to Tffd700{Te6edf3decrypt_pathTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Tff7b72return Te6edf3exitTb4b4b4(Te6edf3R_OKTb4b4b4) Tff7b72if Tff7b72not Te6edf3__recursive Tff7b72else Te6edf3R_OK
T8b949e################
T8b949e# File Output #
T8b949e################
Tff7b72def Td2a8ffwrite_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3wp Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)
Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72= Tff7b72False
Tff7b72if Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3argsTff7b72.Td2a8ffexport_prvTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3wpTb4b4b4) Tff7b72or Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4:
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3wpTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffWrote private identity to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3wpTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFile Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3wpTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72elif Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3wpTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3PUB_EXTTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3wp Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff.Tffd700{Te6edf3PUB_EXTTffd700}Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3wpTb4b4b4) Tff7b72or Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4:
Te6edf3identityTff7b72.Td2a8ffpub_to_fileTb4b4b4(Te6edf3wpTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffWrote public identity to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3wpTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFile Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3wpTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_FILE_EXISTSTb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity holds neither a public nor private keyTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_KEYSTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffError while writing imported identity to file: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_WRITE_ERRORTb4b4b4)
T8b949e###################
T8b949e# Terminal Output #
T8b949e###################
Tff7b72def Td2a8ffprint_identity_informationTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity Hash : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprvTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffprint_privateTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : HiddenTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_hash_informationTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3hashlen Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2
Tff7b72if Tff7b72not Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72in Tb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657str Tff7b72and Tffa657lenTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72!= Te6edf3hashlenTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity hash lengthTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Te6edf3aspects Tff7b72= Te6edf3argsTff7b72.Td2a8ffhashTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3aspectsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination aspects specifiedTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_ASPECTSTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3app_name Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4; Te6edf3aspects Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentity Tff7b72and Tff7b72not Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity does not hold a public keyTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PUBKEYTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4:
Te6edf3identity_hash Tff7b72= Te6edf3identityTff7b72.Td2a8ffhash
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657strTb4b4b4:
Te6edf3destination Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4: Te6edf3identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identityTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identityTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_INVALID_IDENTITYTb4b4b4)
Te6edf3destination_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Te6edf3argsTff7b72.Td2a8ffhashTb4b4b4, Te6edf3identity_hashTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe Tffd700{Te6edf3argsTff7b72.Td2a8ffhashTffd700}Ta5d6ff destination for this Identity is Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3destinationTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe full destination specifier is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error ocurred while attempting to get hash information: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_UNKNOWN_ERRORTb4b4b4)
Tff7b72def Td2a8ffexport_pub_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Te6edf3k Tff7b72= Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3kTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity doesnTa5d6ff'Ta5d6fft hold a public key, cannot exportTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PUBKEYTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPublic Identity Keys : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3kTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPublic Identity Keys : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3kTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPublic Identity Keys : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3kTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffexport_prv_identityTb4b4b4(Te6edf3argsTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Te6edf3k Tff7b72= Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3kTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity doesnTa5d6ff'Ta5d6fft hold a private key, cannot exportTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_NO_PRVKEYTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Identity Keys : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3kTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Identity Keys : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3kTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Identity Keys : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3kTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
T8b949e##############################
T8b949e# Helper & Utility Functions #
T8b949e##############################
Tff7b72def Td2a8ffget_editor_contentTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3NamedTemporaryFile
Te6edf3template Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3editor Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffEDITORTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3editorTb4b4b4:
Tff7b72for Te6edf3fallback Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffnanoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvimTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffviTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffwhichTa5d6ff"Tb4b4b4, Te6edf3fallbackTb4b4b4]Tb4b4b4, Te6edf3checkTff7b72=Tff7b72TrueTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4)
Te6edf3editor Tff7b72= Te6edf3fallback
Tff7b72break
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffCalledProcessErrorTb4b4b4: Tff7b72continue
Tff7b72if Tff7b72not Te6edf3editorTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not launch editorTa5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)Tb4b4b4;
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3NamedTemporaryFileTb4b4b4(Te6edf3modeTff7b72=Ta5d6ff"Ta5d6ffw+Ta5d6ff"Tb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ff.tmpTa5d6ff"Tb4b4b4, Te6edf3deleteTff7b72=Tff7b72FalseTb4b4b4) Tff7b72as Te6edf3tmpTb4b4b4:
Te6edf3tmp_path Tff7b72= Te6edf3tmpTff7b72.Td2a8ffname
Te6edf3tmpTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3templateTb4b4b4)
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Te6edf3editorTb4b4b4, Te6edf3tmp_pathTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEditor exited with error code Tffd700{Te6edf3resultTff7b72.Td2a8ffreturncodeTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmp_pathTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3content Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tff7b72return Te6edf3contentTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not get content from editor: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3exitTb4b4b4(Te6edf3R_READ_ERRORTb4b4b4)
Tff7b72def Td2a8ffspinTb4b4b4(Te6edf3untilTff7b72=Tff7b72NoneTb4b4b4, Te6edf3msgTff7b72=Tff7b72NoneTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ff⢄⢂⢁⡁⡈⡐⡠Ta5d6ff"
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tffa657printTb4b4b4(Te6edf3msgTff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72while Tb4b4b4(Te6edf3timeout Tff7b72== Tff7b72None Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72<Te6edf3timeoutTb4b4b4) Tff7b72and Tff7b72not Te6edf3untilTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Tffa657lenTb4b4b4(Te6edf3msgTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72None Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4: Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72True
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────